package com.spn.blog.article.config;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.spn.blog.article.dao.mapper.ArticleMapper;
import com.spn.blog.common.dao.pojo.Article;
import com.spn.blog.common.vo.Result;
import com.spn.blog.service.article.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.core.Booleans;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.List;

@Component
@Slf4j
public class InitData {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    private ArticleMapper articleMapper;
    @Autowired
    private ArticleService articleService;


    /**
     * 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行
     */
    @PostConstruct
    public void initViewCount(){
        //为了 保证 启动项目的时候，redis中的浏览量 如果没有，读取数据库的数据，进行初始化
        //便于更新的时候 自增
        // articles 获取原始数据
        List<Article> articles = articleMapper.selectList(new LambdaQueryWrapper<>());
        for (Article article : articles) {
            //查看redis是否缓存了数据库的值
            String viewCountStr = (String) redisTemplate.opsForHash().get("view_count", article.getId());
            String commentCountStr = (String) redisTemplate.opsForHash().get("comment_count", article.getId());
            //如果查询到redis中是null，就说明该文章的访问量记录已经过期，不能直接操作，不然redis会默认赋值访问量为0
            //此时进行初始化到redis中
            if (StringUtils.isBlank(viewCountStr)){
                //初始化 在view_count表中，加入key为文章ID，value为文章访问量。目的：为了方便定时器统一把文章的访问量同步到数据库中。
                redisTemplate.opsForHash().put("view_count", String.valueOf(article.getId()),String.valueOf(article.getViewCounts()));
            }
            if (StringUtils.isBlank(commentCountStr)){
                redisTemplate.opsForHash().put("comment_count", article.getId(), String.valueOf(article.getCommentCounts()));
            }
        }
        log.info("初始化 文章浏览量 成功");
    }

    @PostConstruct
    public void initES(){
        Result result = articleService.moveArticleToES();
        Boolean success = (Boolean)result.getData();
        if (success){
            log.info("初始化 ES数据 成功");
        }else{
            log.warn("初始化 ES数据 失败");
        }

    }
}
